/**
 * Generali Solutions d'assurances - Tous droits rï¿½servï¿½s &copy; 2007 - 2010
 */
package fr.generali.accueilclient.referentiel.assembler;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.core.convert.converter.Converter;

import fr.generali.accueilclient.referentiel.ReferentielEnum;
import fr.generali.accueilclient.utils.tuple.Couple;
import fr.generali.refservcommuns.rce.demat.referentiel.client.list.param.ListParamClient;
import fr.generali.refservcommuns.rce.demat.referentiel.client.list.param.ValeurParamTable;

/**
 * @author Guillaume Lancelin
 */
public class ListParamClient2MapConverter implements
                Converter<ListParamClient, Couple<ReferentielEnum, Map<String, String>>> {

    /**
     * {@inheritDoc}
     */
    public Couple<ReferentielEnum, Map<String, String>> convert(ListParamClient input) {
        Couple<ReferentielEnum, Map<String, String>> couple = null;

        // Civilite courte
        if ("PARAMLIBTITRECOURT".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.CIVILITE_COURT, input);
        }

        // Civilite
        if ("PARAMLIBTITREPERS".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.CIVILITE, input);
        }

        // Code NAF
        if ("PARAMLIBCODENAF".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.CODE_NAF, input);
        }

        // Sous type donnees communication : personnel ou professionel
        if ("PARAMLIBSOUSTYPECOM".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.DONNEE_COMMUNICATION_SOUS_TYPE, input);
        }

        // Niveau CA
        if ("PARAMLIBNIVEAUCA".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NIVEAU_CA, input);
        }

        // Part CA a l'export
        if ("PARAMLIBPARTCAEXPORT".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.PART_CA_EXPORT, input);
        }

        // Pays
        if ("PARAMLIBPAYS".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.PAYS, input);
        }

        // Nationalite
        if ("PARAMLIBNATIONALITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NATIONALITE, input);
        }

        // Qualite de l'occupation
        if ("PARAMLIBSTATUTOCCUPANT".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.QUALITE_OCCUPATION, input);
        }

        // Normalisation
        if ("PARAMLIBNORMALISATION".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NORMALISATION, input);
        }

        // Fonds de commerce
        if ("PARAMLIBFONDSCOMMERCE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.FONDS_COMMERCE, input);
        }

        // Type de logement
        if ("PARAMLIBTYPEBATIMENT".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TYPE_LOGEMENT, input);
        }

        // Revenu annuel
        if ("PARAMLIBREVENUANNUEL".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.REVENU_ANNUEL, input);
        }

        // Regime matrimonial
        if ("PARAMLIBTYPEUNION".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.REGIME_MATRIMONIAL, input);
        }

        // Secteur d'activitï¿½s
        if ("PARAMLIBSECTEURACTIVITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.SECTEUR_ACTIVITE, input);
        }

        // Rï¿½gime obligatoire
        if ("PARAMLIBREGIMEOBLIGATOIRE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.REGIME_OBLIGATOIRE, input);
        }

        // Caisse retraite
        if ("PARAMLIBRETRAITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.CAISSE_RETRAITE, input);
        }

        // Origine du client
        if ("PARAMLIBORIGINEPERSONNE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.ORIGINE_PERSONNE, input);
        }

        // Media d'origine
        if ("PARAMLIBMEDIACONNAISSANCE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.MEDIA_ORIGINE, input);
        }

        // Statut
        if ("PARAMLIBSTATUTPERSONNE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT, input);
        }

        // Type de procï¿½dure
        if ("PARAMLIBTYPEPROCEDURE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TYPE_PROCEDURE, input);
        }

        // Type de piece d'identite
        if ("PARAMLIBTYPEIDENTITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TYPE_PIECE_IDENTITE, input);
        }

        // Categorie du permis
        if ("PARAMLIBCATEGORIEPERMIS".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.CATEGORIE_PERMIS, input);
        }

        // Statut de la piece d'identite
        if ("PARAMLIBSTATUTIDENTITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT_IDENTITE, input);
        }

        // Nombre de cadres
        if ("PARAMLIBNBCADRES".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NB_CADRES, input);
        }

        // Nombre de salariï¿½s
        if ("PARAMLIBNBSALARIES".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NB_SALARIES, input);
        }

        // Nombre d'habitants dans la collectivitï¿½
        if ("PARAMLIBNBHABITCOLLECTIVITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NB_HABITANTS_COLLECTIVITE, input);
        }

        // Budget de la collectivitï¿½
        if ("PARAMLIBBUDGETCOLLECTIVITE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.BUDGET_COLLECTIVITE, input);
        }

        // Budget de l'association
        if ("PARAMLIBBUDGETASSO".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.BUDGET_ASSOCIATION, input);
        }

        // Sexe
        if ("PARAMLIBSEXE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.SEXE, input);
        }

        // Situation familiale
        if ("PARAMLIBSITFAM".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.SITUATION_FAMILIALE, input);
        }

        // Statut juridique
        if ("PARAMLIBSTATJUR".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT_JURIDIQUE, input);
        }

        // Statut professionnel niveau 1
        if ("PARAMLIBCSP".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT_PROFESSIONNEL_NIVEAU_1, input);
        }

        // Statut professionnel niveau 2
        if ("PARAMLIBCSP2".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT_PROFESSIONNEL_NIVEAU_2, input);
        }

        // Statut professionnel niveau 3
        if ("PARAMLIBCSP3".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT_PROFESSIONNEL_NIVEAU_3, input);
        }

        // Statut professionnel niveau 4
        if ("PARAMLIBCSP4".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.STATUT_PROFESSIONNEL_NIVEAU_4, input);
        }

        // Titre
        if ("PARAMLIBTITREFONCTION".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TITRE, input);
        }

        // Type association
        if ("PARAMLIBTYPEASSOCIATION".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TYPE_ASSOCIATION, input);
        }

        // Type client
        if ("PARAMLIBCODEROLE".equals(input.getParamTable().getNomTable())) {
            // couple = buildCouple(ReferentielEnum.TYPE_CLIENT, input);
            couple = buildCoupleTypeClient(ReferentielEnum.TYPE_CLIENT, input);
        }

        // Type personne morale
        if ("PARAMLIBTYPEPERSMORALE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TYPE_PERSONNE_MORALE, input);
        }

        // Motif d'invalidite d'adresse
        if ("PARAMLIBMOTIFINVALIDADRESSE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.MOTIF_INVALID_ADRESSE, input);
        }

        // Relation avec le client
        if ("PARAMLIBRELATION".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.RELATION, input);
        }

        // Type charte
        if ("PARAMLIBTYPECHARTE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.TYPE_CHARTE, input);
        }

        // Canal de preference
        if ("PARAMLIBCANAL".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.CANAL_PREFERENCE, input);
        }

        // Incapacitï¿½ Juridique
        if ("PARAMLIBINCAPACITEJURIDIQUE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.INCAPACITE_JURIDIQUE, input);
        }

        // Mois
        if ("PARAMLIBMOIS".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.MOIS, input);
        }

        // Nombre d'adhï¿½rents
        if ("PARAMLIBNBADHERENTSASSO".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.NB_ADHERENTS, input);
        }

        // Table des paramï¿½tres de vente
        if ("PARAMTECVALINDICMKTG".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.PARAMETRE_DE_VENTE, input);
        }

        // Table des motifs de modification d'adresse
        if ("PARAMLIBMOTIFMODIFADRESSE".equals(input.getParamTable().getNomTable())) {
            couple = buildCouple(ReferentielEnum.MOTIF_MODIF_ADRESSE, input);
        }
        
        if("PARAMLIBFILIERE".equals(input.getParamTable().getNomTable())){
            couple = buildCouple(ReferentielEnum.FILIERE_DEMAT, input);          
        }

        return couple;
    }

    /**
     * Construit le couple (referentiel, liste de valeurs) quand on prend toutes
     * les valeurs renvoyees par le service
     * 
     * @param referentiel le rï¿½fï¿½rentiel
     * @param input un {@link ListParamClient} fourni par le service
     * @return le couple (referentiel, liste de valeurs)
     */
    private Couple<ReferentielEnum, Map<String, String>> buildCouple(ReferentielEnum referentiel, ListParamClient input) {
        Map<String, String> liste = buildListe(input);

        return new Couple<ReferentielEnum, Map<String, String>>(referentiel, liste);
    }

    /**
     * Construit la liste des references quand on les prend toutes
     * 
     * @param input un {@link ListParamClient} fourni par le service
     * @return la liste des references
     */
    private Map<String, String> buildListe(ListParamClient input) {
        List<ValeurParamTable> valeurParamTableListe = input.getValeurParamTable();
        Map<String, String> liste = new HashMap<String, String>(valeurParamTableListe.size());
        for (int i = 0; i < valeurParamTableListe.size(); i++) {
            ValeurParamTable valeurParamTable = valeurParamTableListe.get(i);
            liste.put(valeurParamTable.getCodeParam(), valeurParamTable.getValeurParam());
        }

        return liste;
    }

    /**
     * Construit le couple (referentiel, liste de valeurs) quand on prend toutes
     * les valeurs renvoyees par le service
     * 
     * @param referentiel le referentiel
     * @param input un {@link ListParamClient} fourni par le service
     * @return le couple (referentiel, liste de valeurs)
     */
    private Couple<ReferentielEnum, Map<String, String>> buildCoupleTypeClient(ReferentielEnum referentiel,
                    ListParamClient input) {
        Map<String, String> liste = buildListeTypeClient(input);

        return new Couple<ReferentielEnum, Map<String, String>>(referentiel, liste);
    }

    /**
     * Construit la liste des references quand on les prend toutes
     * 
     * @param input un {@link ListParamClient} fourni par le service
     * @return la liste des references
     */
    private Map<String, String> buildListeTypeClient(ListParamClient input) {
        List<ValeurParamTable> valeurParamTableListe = input.getValeurParamTable();
        Map<String, String> liste = new HashMap<String, String>(valeurParamTableListe.size());
        for (int i = 0; i < valeurParamTableListe.size(); i++) {
            ValeurParamTable valeurParamTable = valeurParamTableListe.get(i);
            if ("AC".equals(valeurParamTable.getCodeParam()) || "CL".equals(valeurParamTable.getCodeParam())
                            || "PP".equals(valeurParamTable.getCodeParam())) {
                liste.put(valeurParamTable.getCodeParam(), valeurParamTable.getValeurParam());
            }
        }

        return liste;
    }
}
